package org.wdcode.web.mina.service;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.List;

import org.apache.mina.core.service.IoAcceptor;
import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.util.CommonUtil;
import org.wdcode.web.mina.filter.MinaIoFilter;
import org.wdcode.web.mina.need.MinaAcceptorNeed;

/**
 * mini IO接受器实现类
 * @author WD
 * @since JDK6
 * @version 1.0 2010-08-05
 */
final class MinaIoAcceptorImpl implements MinaIoAcceptor {
	// Mina包装
	private MinaAcceptorNeed	need;
	// IO接受器
	private IoAcceptor			ioAcceptor;

	/**
	 * 构造方法
	 * @param need Mina包装
	 */
	public MinaIoAcceptorImpl(MinaAcceptorNeed need) {
		this.need = need;
		this.ioAcceptor = need.getIoAcceptor();
	}

	/**
	 * 初始化方法
	 */
	public final void init() {
		// 获得过滤器列表
		List<MinaIoFilter> list = need.getIoFilters();
		// 判断过滤器不为空
		if (!CommonUtil.isEmpty(list)) {
			// Mina 过滤器
			MinaIoFilter ioFilter = null;
			// 循环过滤器列表
			for (int i = 0; i < list.size(); i++) {
				// 获得过滤器
				ioFilter = list.get(i);
				// 添加过滤器
				ioAcceptor.getFilterChain().addLast(ioFilter.getName(), ioFilter.getIoFilter());
			}
		}
		// 设置IO处理器
		ioAcceptor.setHandler(need.getIoHandler());
	}

	/**
	 * 关闭资源
	 */
	public final void close() {
		// 解除绑定
		unbind();
		// 清除过滤器
		ioAcceptor.getFilterChain().clear();
		// 清除处理器
		ioAcceptor.setHandler(null);
		// 清除地址
		ioAcceptor.setDefaultLocalAddress(null);
		// 销毁资源
		ioAcceptor.dispose();
	}

	/**
	 * 绑定端口 开始监听服务
	 */
	public final void bind() {
		try {
			ioAcceptor.bind(new InetSocketAddress(need.getPort()));
		} catch (IOException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 解除绑定端口 停止服务
	 */
	public final void unbind() {
		ioAcceptor.unbind();
	}

	/**
	 * 获得Mina包装
	 * @return Mina包装
	 */
	public final MinaAcceptorNeed getNeed() {
		return need;
	}

	/**
	 * 设置Mina包装
	 * @param need Mina包装
	 */
	public final void setNeed(MinaAcceptorNeed need) {
		this.need = need;
	}

	/**
	 * 获得IO接受器
	 * @return IO接受器
	 */
	public final IoAcceptor getIoAcceptor() {
		return ioAcceptor;
	}

	/**
	 * 设置IO接受器
	 * @param ioAcceptor IO接受器
	 */
	public final void setIoAcceptor(IoAcceptor ioAcceptor) {
		this.ioAcceptor = ioAcceptor;
	}
}
